package chaoyue.study.juc;

import chaoyue.study.ThreadUtils;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

/**
 * 阻塞队列
 * 阻塞队列可以很方便的实现生产者/消费者模型
 * 阻塞和唤醒使用Condition来实现
 * ArrayBlockingQueue使用循环数组来实现的队列
 */
public class BlockingQueueTest {
    public static void main(String[] args) {
        // 阻塞队列创建
        BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10);

        // 生产者线程 往阻塞队列里放元素，队列满则阻塞等待 不满则可以继续放
        new Thread(() -> {
            for (int i = 0; ; i++) {
                try {
                    ThreadUtils.sleepRandom(1000);
                    queue.put(i); // 如果队列满了，这里会阻塞
                    System.out.println("生产者生产：" + i);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();

        // 消费者线程 从阻塞队列里获取元素，队列空则阻塞等待 不空则可以继续取
        new Thread(() -> {
            while (true) {
                try {
                    //ThreadUtils.sleep();
                    int value = queue.take(); // 如果队列为空，这里会阻塞
                    System.out.println("消费者消费：" + value);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}
